const db = require('../db/sql');

const bcrypt = require('bcryptjs');

const jwt = require('jsonwebtoken');

const config = require('../config');

// TODO 注册
exports.reguser = (req, res) => {
  // TODO 1 检测表单数据是否合法
  const userInfo = req.body; // 接收表单数据
  if (!userInfo.username || !userInfo.password) {
    return res.send({
      success: false,
      message: '用户名密码不能为空',
    });
  }

  // TODO 2 检测用户名是否被占用
  const sqlStr = 'select * from cs_base where username=?';

  db.query(sqlStr, [userInfo.username], (err, results) => {
    // * 判断sql语句是否出错
    if (err) {
      return res.send({
        success: false,
        message: err.message,
      });
    }
    // * 没有该username 返回一个空数组,length=0
    if (results.length > 0) {
      return res.send({
        success: false,
        message: '用户名被占用，请更换用户名',
      });
    }
    // TODO 3 对密码进行加密处理 插入新用户
    userInfo.password = bcrypt.hashSync(userInfo.password, 10);
    const sqlStr = 'insert into cs_base set ?';
    db.query(
      sqlStr,
      {
        username: userInfo.username,
        password: userInfo.password,
      },
      (err, results) => {
        // * 判断sql语句是否出错
        if (err)
          return res.send({
            success: false,
            message: err.message,
          });
        // * 判断受影响行数
        if (results.affectedRows !== 1) {
          return res.send({
            success: false,
            message: '注册失败，请稍后再试',
          });
        }
        res.send({
          success: true,
          message: '注册成功！',
        });
      }
    );
  });
};

// 检测表单数据是否合法
// 根据用户名查询用户的数据
// 判断用户输入的密码是否正确
// 生成 JWT 的 Token 字符串

// TODO 登录
exports.login = (req, res) => {
  const sqlStr = 'select * from cs_base where username = ?';

  db.query(sqlStr, req.body.username, (err, results) => {
    // * 判断sql语句是否出错
    if (err)
      return res.send({
        success: false,
        message: err.message,
      });
    // * 是否能获取到信息数组
    if (results.length !== 1) {
      return res.send({
        success: false,
        message: '账号不存在',
      });
    }

    //  * 第三方模块对比确认密码
    const flag = bcrypt.compareSync(req.body.password, results[0].password);
    if (!flag)
      return res.send({
        success: false,
        message: '账号或密码错误',
      });

    const userInfo = { ...results[0] };

    delete userInfo['password']

    // * 生产 token 字符串
    const tokenStr = jwt.sign(userInfo, config.jwtSecretKey, {
      expiresIn: '240h',
    }); // token 有效期

    // * 响应出去
    res.send({
      success: true,
      message: '登录成功!',
      data: {
        ...userInfo,
        token: 'Bearer ' + tokenStr
      }
    });
  });
};
